Foreground & Background
App State
Foreground와 Background는 앱의 상태를 뜻한다.
앱은 크게 5가지 상태를 가지는데, not Running, Inactive, Active, Background, Suspend가 있다.

- not Running: 앱이 실행되지 않은 상태
- Foreground 상태
- Inactive: 앱이 실행중이지만 아직 아무런 이벤트를 받지 않은 상태 (Foreground 상태에서 전화가 왔을 때, 잠금상태, 멀티태스킹 스크린에서는 InActive 상태를 가진다.)
- Active: 앱이 실행중이며 현재 이벤트를 받고 있고 발생한 상태
- Background: 앱이 백그라운드에 있는 상태이지만 여전히 실행되고 있는 코드가 있는 상태
- Suspend: 앱이 백그라운드에 있고 실행되는 코드가 없는 상태 (App은 여전히 메모리에 존재하며 Suspend 상태가 될 당시의 상태를 저장하고 있지만, CPU나 배터리를 소모하지 않는다. 언제든지 메모리 부족등의 이유로 종료됨.)
Foreground
Foreground mode는 메모리 및 기타 시스템 리소스에 높은 우선순위를 가지며 시스템은 이러한 리소스를 사용할 수 있도록 필요에 따라 background 앱을 종료한다. (예를 들어 아이폰 램을 테스트한다고 게임과 카메라를 번갈아가며 실행하는 유튜버를 본 적이 있다. 리소스가 적은 기종의 경우 게임이 로딩부터 재시작 된다.)
Background
Background mode는 가능한 적은 메모리공간을 사용해야한다. 사용자 이벤트를 받기 어렵고 공유 시스템 리소스를 해제하고 이미지 객체 참조 등 메모리에 제한이 있다.
Xcode - Capabilities - Background Modes에서 Background 상태에서 이벤트를 처리할 수 있도록 지원해준다.

위 사진에 포함된 기능 중 몇 가지 설명해보면
- Audio, AirPlay and Picture in Picture: Audio를 지속적으로 실행 할 수 있다. 음악, 영상 관련앱이 아닌 경우 이 기능을 체크하면 AppStore 심사 시 Reject을 받게 된다.
- Location updates: GPS가 변할 때 마다 Event를 처리할 수 있다.
- Remote notifications: FCM payload에 "content-available": true가 포함된 경우 App을 깨워 Event를 처리할 수 있습니다. (백그라운드 푸시 알림을 사용할 때 체크한다. 관련 기능 개발 때 자세히 알아봐야겠다.)
참고자료